package com.rcadmin.busi.web.service;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.transaction.Transactional;

import org.apache.commons.beanutils.BeanUtils;
import org.springframework.boot.autoconfigure.amqp.RabbitProperties.Template;
import org.springframework.stereotype.Component;

import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.rcadmin.busi.admin.ddl.SysParam;
import com.rcadmin.busi.web.contant.TemplateType;
import com.rcadmin.busi.web.dao.TemplateDao;
import com.rcadmin.busi.web.ddl.WebTemplate;
import com.rcadmin.busi.web.ddl.WebTemplateGroupkey;
import com.rcadmin.busi.web.ddl.WebTemplatePackage;
import com.rcadmin.busi.web.dto.WebTemplateDto;
import com.rcadmin.common.contant.IsEff;
import com.rcadmin.core.jpa.DaoException;
import com.rcadmin.core.jpa.util.PageBean;

/**
 * 
 * @author tanson lam
 * @create 2016年10月13日
 */
@Component
public class TemplateService {
	@Resource
	private TemplateDao templateDao;
	@Resource
	private TemplatePackageService templatePackageService;

	/**
	 * 获取模板包中所有资源模板列表，并封装到{@link #SysParam}对象列表返回。
	 */
	public List<SysParam> getResTemplate(Integer userId,
			Integer templatePackageId) {
		if (templatePackageId == null)
			return Lists.newArrayList();

		List<WebTemplate> templateList = templateDao.findByTemplatePackageId(
				userId, templatePackageId);
		List<SysParam> sysParamList = new ArrayList<SysParam>();
		for (WebTemplate g : templateList) {
			if (!g.getIseff().equals(IsEff.EFFECTIVE)
					|| !TemplateType.RES.equals(TemplateType.ofTemplateType(g
							.getTemplateType())))
				continue;
			SysParam p = new SysParam();
			p.setParamValue(g.getId().toString());
			p.setParamName(g.getName());
			sysParamList.add(p);
		}

		return sysParamList;
	}

	/**
	 * 查找单个模板
	 * 
	 * @param userId
	 * @param templateId
	 * @return
	 */
	public WebTemplate findOne(Integer userId, Integer templateId) {
		return templateDao.findOne(userId, templateId);
	}

	/**
	 * 是否有相同的模板路径
	 * 
	 * @param userId
	 * @param templatePackageId
	 * @param templateId
	 * @param templatePath
	 * @return
	 * @throws DaoException
	 */
	public Boolean isDuplicateTemplatePath(Integer userId,
			Integer templatePackageId, Integer templateId, String templatePath)
			throws DaoException {
		return templateDao.isDuplicateTemplatePath(userId, templatePackageId,
				templateId, templatePath);
	}

	/**
	 * 保存
	 * 
	 * @param webTemplate
	 */
	@Transactional
	public void save(WebTemplate webTemplate) {
		templateDao.save(webTemplate);
	}

	public PageBean<WebTemplateDto> pageQuery(String condition, String orderBy,
			Integer pageSize, Integer page) {
		PageBean<WebTemplate> entityPageBean = templateDao.pageQuery(condition,
				orderBy, pageSize, page);
		List<WebTemplateDto> dtoList = Lists.newArrayList();
		final List<Integer> idsList = Lists.transform(
				entityPageBean.getResult(),
				new Function<WebTemplate, Integer>() {
					@Override
					public Integer apply(WebTemplate model) {
						if (model == null)
							return null;
						return model.getTemplatePackageId();
					}
				});

		Map<Integer, WebTemplatePackage> templatePackMap = templatePackageService
				.findByIds(idsList);
		for (WebTemplate model : entityPageBean.getResult()) {
			WebTemplateDto dto = new WebTemplateDto();
			try {
				BeanUtils.copyProperties(dto, model);
				if (model.getTemplatePackageId() != null
						&& templatePackMap.get(model.getTemplatePackageId()) != null) {
					dto.setTemplatePackageName(templatePackMap.get(
							model.getTemplatePackageId()).getName());
				}
				translateDto(dto);
				dtoList.add(dto);
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				e.printStackTrace();
			}
		}

		return PageBean.copy2DtoPageBean(entityPageBean, dtoList);
	}

	private void translateDto(WebTemplateDto dto) {
		dto.setTemplateTypeCn(TemplateType
				.ofTemplateType(dto.getTemplateType()).getMsg());
	}
}
